
#include <avr/io.h>
#include <stdio.h>
#include <string.h>

int bluetooth_uart_putchar(char c, FILE * f_unused)      
{
	loop_until_bit_is_set(UCSRA, UDRE); // asteapta pana cand este trimis caracterul anterior

    UDR = c;							// se scrie bufferul cu caracterul dorit - apoi, automat, 
										// UART-ul va face toata treaba
    return 0;
}

int bluetooth_uart_getchar(FILE* f)
{
    loop_until_bit_is_set(UCSRA, RXC);  // se asteapta pana exista un caracter nou in bufferul USART-ului
	return UDR;
}


int hyperterminal_uart_putchar(char c, FILE * f_unused)      
{
	if(c == '\n')						// daca caracterul este "end-of-line" CR_LF
		hyperterminal_uart_putchar( '\r', f_unused);		// se reapeleaza functia cu: CR (pentru a face VTerm-ul fericit!)
 	
	loop_until_bit_is_set(UCSRA, UDRE); // asteapta pana cand este trimis caracterul anterior

    UDR = c;							// se scrie bufferul cu caracterul dorit - apoi, automat, 
										// UART-ul va face toata treaba
    return 0;
}




int hyperterminal_uart_getchar(FILE* f)
{
    char c;
    
    loop_until_bit_is_set(UCSRA, RXC);  // se asteapta pana exista un caracter nou in bufferul USART-ului

    c = UDR;							// se preia caracterul

    if(c == '\r')						// daca este un CR, se inlocuieste cu CRLF (vezi uart_putchar)
		c = '\n';
    hyperterminal_uart_putchar(c,NULL);

    return c;
}

FILE hyperterminal_uart_stdout = FDEV_SETUP_STREAM(hyperterminal_uart_putchar, NULL, _FDEV_SETUP_WRITE);
FILE hyperterminal_uart_stdin  = FDEV_SETUP_STREAM(NULL, hyperterminal_uart_getchar, _FDEV_SETUP_READ);

FILE bluetooth_uart_stdout = FDEV_SETUP_STREAM(bluetooth_uart_putchar, NULL, _FDEV_SETUP_WRITE);
FILE bluetooth_uart_stdin  = FDEV_SETUP_STREAM(NULL, bluetooth_uart_getchar, _FDEV_SETUP_READ);

// initializarea UART-ului ////////////////////////////////
void uart_init(void)
{
    UBRRH = 0;			// baudrate-ul este pe 16 biti si daca procesorul merge la 16 MHz
    UBRRL = 0x67;		//    pentru un baudrate de 9600 registrul UBRR va fi 0x0067

    UCSRB = _BV(RXEN) | _BV(TXEN);		// UART-ul este activat pentru receptie si transmisie

    UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); 	// UART-ul este configurat pentru Rx/Tx de 8 biti
													// implicit USBS este 0   = un sigur bit de STOP
													// implicit UPM1:0 sunt 0 = fara paritate
	stdout = &bluetooth_uart_stdout;
    stdin  = &bluetooth_uart_stdin;

}// IMPORTANT: Verificati daca atat VTerm-ul (Proteus) cat si HiperTerm-ul (Windows) au aceleasi setari


